package com.hengxinguotong.zhihuichengjian.fragment;

import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.google.gson.Gson;
import com.hengxinguotong.zhihuichengjian.R;
import com.hengxinguotong.zhihuichengjian.ui.app.BaseFragment;
import com.hengxinguotong.zhihuichengjian.bean.EnergyBeanRes;
import com.hengxinguotong.zhihuichengjian.ui.EnergyActivity;
import com.hengxinguotong.zhihuichengjian.utils.SPUtil;
import com.hengxinguotong.zhihuichengjian.utils.TimeUtils;
import com.hengxinguotong.zhihuichengjian.utils.Utils;
import com.hengxinguotong.zhihuichengjian.widget.font.HXTextView;
import com.lidroid.xutils.http.RequestParams;

import org.apache.http.entity.StringEntity;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.model.Viewport;
import lecho.lib.hellocharts.view.LineChartView;

/**
 * Created by Administrator on 2017/9/12.
 */

public class EnergyFragment extends BaseFragment implements View.OnClickListener{

    @BindView(R.id.chart_ll)
    LinearLayout chart_ll;
    @BindView(R.id.line_chart)
    LineChartView lineChart;
    @BindView(R.id.unit_tv)
    HXTextView tvUnit;
    @BindView(R.id.month_tv)
    HXTextView monthTv;
    @BindView(R.id.box1)
    RelativeLayout box1;
    @BindView(R.id.purple_line)
    ImageView purple_line;
    @BindView(R.id.tv1)
    HXTextView tv1;
    @BindView(R.id.box2)
    RelativeLayout box2;
    @BindView(R.id.orange_line)
    ImageView orange_line;
    @BindView(R.id.tv2)
    HXTextView tv2;
    @BindView(R.id.box3)
    RelativeLayout box3;
    @BindView(R.id.skyblue_line)
    ImageView skyblue_line;
    @BindView(R.id.tv3)
    HXTextView tv3;

    private View rootView = null;
    private String type;
    List<AxisValue> axisXValues;
    EnergyBeanRes beanRes;
    private String equipmentType;

    public String getEquipmentType() {
        return equipmentType;
    }

    public void setEquipmentType(String equipmentType) {
        this.equipmentType = equipmentType;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_energy, null);
            ButterKnife.bind(this, rootView);
        } else {
            ViewGroup parent = (ViewGroup) rootView.getParent();
            if (parent != null) {
                parent.removeView(rootView);
            }
        }
        ButterKnife.bind(this, rootView);
        return rootView;
    }

    public static EnergyFragment newInstance(String type) {
        EnergyFragment fragment = new EnergyFragment();
        Bundle args = new Bundle();
        args.putString("type", type);
        fragment.setArguments(args);
        return fragment;
    }

    public void reLoad(){
        getDeviceInfo("加载中…");
        box1.setClickable(true);
    }

    //汇总
    public void setTotal(){
        clearState();
        for(int i=0; i<beanRes.getValue().getYdata().size(); i++){
            switch (i){
                case 0:
                    purple_line.setImageResource(R.mipmap.blue_line);
                    tv1.setText("总计");
                    box1.setVisibility(View.VISIBLE);
                    box1.setClickable(false);
                    break;
                case 1:
                    box2.setVisibility(View.GONE);
                    break;
                case 2:
                    box3.setVisibility(View.GONE);
                    break;
            }
        }
        initChartView(beanRes.getValue().getCount(), Color.parseColor("#ff36a1da"));
    }
    //分表
    public void setSeperate(){
        clearState();
        for(int i=0; i<beanRes.getValue().getYdata().size(); i++){
            switch (i){
                case 0:
                    tv1.setText(beanRes.getValue().getYdata().get(0).getName());
                    purple_line.setImageResource(R.mipmap.purple_line);
                    box1.setVisibility(View.VISIBLE);
                    box1.setClickable(true);
                    break;
                case 1:
                    box2.setVisibility(View.VISIBLE);
                    break;
                case 2:
                    box3.setVisibility(View.VISIBLE);
                    break;
            }
        }
        initChartView(beanRes.getValue());
    }

    private void getDeviceInfo(String alert) {
        JSONObject jsonObject = new JSONObject();

        try {
            jsonObject.put("constructionId", SPUtil.getString(getActivity(),"constructionid"));
            jsonObject.put("equipmentType", equipmentType);//能耗类型（1电，2：水）
            type = getArguments().getString("type");
            jsonObject.put("type", type);//类型（日：1，周：2，月：3）
        } catch (JSONException e) {
            e.printStackTrace();
        }

        RequestParams params = new RequestParams();
        params.addHeader("Content-type", "application/json");
        try {
            params.setBodyEntity(new StringEntity(jsonObject.toString(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Utils.requestData(alert, getActivity(), "/electric/getEnergy/" + SPUtil.getString(getActivity(),"uuid"), params, new Utils.ListenerJson() {
            @Override
            public void onSuccess(String json) {
                if (!Utils.isEmpty(json)) {
                    Gson gson = new Gson();
                    beanRes = gson.fromJson(json, EnergyBeanRes.class);
                    if(null != beanRes.getValue().getYdata() && beanRes.getValue().getYdata().size()>0){
                        process();
                    } else {
                        showEmptyView(chart_ll);
                    }
                }
            }

            @Override
            public void onFailure(String json) {

            }
        });
    }

    private void process(){
        getAxisXLables(beanRes.getValue().getXdata());
//        if(isSeperate){
        initChartView(beanRes.getValue());
//        }else{
//            initChartView(beanRes.getValue().getCount());
//        }
        boxState();
        for(int i=0; i<beanRes.getValue().getYdata().size(); i++){
            switch (i){
                case 0:
                    tv1.setText(beanRes.getValue().getYdata().get(0).getName());
                    box1.setVisibility(View.VISIBLE);
                    break;
                case 1:
                    tv2.setText(beanRes.getValue().getYdata().get(1).getName());
                    box2.setVisibility(View.VISIBLE);
                    break;
                case 2:
                    tv3.setText(beanRes.getValue().getYdata().get(2).getName());
                    box3.setVisibility(View.VISIBLE);
                    break;
            }
        }
        if(equipmentType.equals(EnergyActivity.ELEC)){
            tvUnit.setText("kw·h");
        } else if (equipmentType.equals(EnergyActivity.WATER)){
            tvUnit.setText("m³");
        }
        if(type.equals("3")){
            monthTv.setText(TimeUtils.getCurrentYear() + "年");
        }else{
            monthTv.setText(TimeUtils.getCurrentMonth() + "月");
        }
    }

    /*
    *获取线形图x轴坐标
    */
    private void getAxisXLables(List<String> xData){
        axisXValues = new ArrayList<AxisValue>();
        for(int i = 0; i < xData.size(); i++ ){
            AxisValue value = new AxisValue(i);//值是在哪显示 i 是指 第i个线形图
            value.setLabel(xData.get(i));//设置显示的文本，默认为线形图的位置
            axisXValues.add(value);
        }
    }
    /**
     * 质量图表的每个点的显示
     */
    private List<PointValue> getAxisPoints(List<String> yData) {
        List<PointValue> pointValues = new ArrayList<PointValue>();
        for (int i = 0; i < yData.size(); i++) {
            if(yData.get(i).length() > 0){
                Float f = Float.parseFloat(yData.get(i));
                pointValues.add(new PointValue(i, f));
            }else{
                pointValues.add(new PointValue(i, 0f));
            }
        }
        return  pointValues;
    }

    //初始化曲线图
    private void initChartView(EnergyBeanRes.EnergyValue value){
        List<Line> lines = new ArrayList<Line>();
        for(int i=0; i<value.getYdata().size(); i++){
            List<PointValue> pointList = getAxisPoints(value.getYdata().get(i).getData());
            Line line = new Line(pointList);  ///折线的颜色
            switch (i){
                case 0:
                    line.setColor(Color.parseColor("#ff9972dd"));
                    break;
                case 1:
                    line.setColor(Color.parseColor("#fff5873f"));
                    break;
                case 2:
                    line.setColor(Color.parseColor("#ff35a1d9"));
                    break;
            }
            line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状  这里是圆形 （有三种 ：ValueShape.SQUARE  ValueShape.CIRCLE  ValueShape.DIAMOND）
            line.setCubic(false);//曲线是否平滑
            line.setStrokeWidth(1);//线条的粗细，默认是3
            line.setPointRadius(2);
            line.setFilled(false);//是否填充曲线的面积
            line.setHasLabels(false);///曲线的数据坐标是否加上备注
            line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据（设置了这个line.setHasLabels(true);就无效）
            line.setHasLines(true);//是否用直线显示。如果为false 则没有曲线只有点显示
            line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示
            lines.add(line);
        }
        LineChartData data = new LineChartData();
        data.setLines(lines);

        //坐标轴
        Axis axisX = new Axis(); //X轴
        axisX.setHasTiltedLabels(false);  //X轴下面坐标轴字体是斜的显示还是直的，true是斜的显示
//	    axisX.setTextColor(Color.WHITE);  //设置字体颜色
        axisX.setTextColor(Color.parseColor("#D6D6D9"));//灰色

//        axisX.setName("未来几天的天气");  //表格名称
        axisX.setTextSize(11);//设置字体大小
        axisX.setMaxLabelChars(7); ////最多几个X轴坐标，意思就是你的缩放让X轴上数据的个数7<=x<=mAxisValues.length
        axisX.setValues(axisXValues);  //填充X轴的坐标名称
        data.setAxisXBottom(axisX); //x 轴在底部
//	    data.setAxisXTop(axisX); //x 轴在顶部
        axisX.setHasLines(true); //x 轴分割线


        Axis axisY = new Axis();  //Y轴
//        axisY.setName("y轴标注");//y轴标注
        axisY.setTextSize(11);//设置字体大小
        data.setAxisYLeft(axisY);  //Y轴设置在左边
        //data.setAxisYRight(axisY);  //Y轴设置在右边
        // 设置行为属性，支持缩放、滑动以及平移
        lineChart.setInteractive(true);//是否支持与用户互动
        lineChart.setZoomEnabled(true);//是否支持缩放
        lineChart.setZoomType(ZoomType.HORIZONTAL);  //缩放类型，水平
        lineChart.setMaxZoom((float) 3);//缩放比例
        lineChart.setLineChartData(data);
        lineChart.setVisibility(View.VISIBLE);
        /**注：下面的7，10只是代表一个数字去类比而已
         * 尼玛搞的老子好辛苦！！！见（http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2）;
         * 下面几句可以设置X轴数据的显示个数（x轴0-7个数据），当数据点个数小于（29）的时候，缩小到极致hellochart默认的是所有显示。当数据点个数大于（29）的时候，
         * 若不设置axisX.setMaxLabelChars(int count)这句话,则会自动适配X轴所能显示的尽量合适的数据个数。
         * 若设置axisX.setMaxLabelChars(int count)这句话,
         * 33个数据点测试，若 axisX.setMaxLabelChars(10);里面的10大于v.right= 7; 里面的7，则
         刚开始X轴显示7条数据，然后缩放的时候X轴的个数会保证大于7小于10
         若小于v.right= 7;中的7,反正我感觉是这两句都好像失效了的样子 - -!
         * 并且Y轴是根据数据的大小自动设置Y轴上限
         * 若这儿不设置 v.right= 7; 这句话，则图表刚开始就会尽可能的显示所有数据，交互性太差
         */
        Viewport v = new Viewport(lineChart.getMaximumViewport());
        v.left = 0;
        v.right= 7;
        lineChart.setCurrentViewport(v);
    }

    //初始化曲线图
    private void initChartView(List<String> yData, int color){
        List<PointValue> pointValues = getAxisPoints(yData);
        Line line = new Line(pointValues).setColor(color);  ///折线的颜色
        List<Line> lines = new ArrayList<Line>();
        line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状  这里是圆形 （有三种 ：ValueShape.SQUARE  ValueShape.CIRCLE  ValueShape.SQUARE）
        line.setCubic(false);//曲线是否平滑
        line.setStrokeWidth(1);//线条的粗细，默认是3
        line.setPointRadius(2);
        line.setFilled(false);//是否填充曲线的面积
        line.setHasLabels(true);///曲线的数据坐标是否加上备注
        line.setHasLabelsOnlyForSelected(false);//点击数据坐标提示数据（设置了这个line.setHasLabels(true);就无效）
        line.setHasLines(true);//是否用直线显示。如果为false 则没有曲线只有点显示
        line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示
        lines.add(line);
        LineChartData data = new LineChartData();
        data.setLines(lines);

        //坐标轴
        Axis axisX = new Axis(); //X轴
        axisX.setHasTiltedLabels(false);  //X轴下面坐标轴字体是斜的显示还是直的，true是斜的显示
//	    axisX.setTextColor(Color.WHITE);  //设置字体颜色
        axisX.setTextColor(Color.parseColor("#D6D6D9"));//灰色

//        axisX.setName("未来几天的天气");  //表格名称
        axisX.setTextSize(11);//设置字体大小
        axisX.setMaxLabelChars(7); ////最多几个X轴坐标，意思就是你的缩放让X轴上数据的个数7<=x<=mAxisValues.length
        axisX.setValues(axisXValues);  //填充X轴的坐标名称
        data.setAxisXBottom(axisX); //x 轴在底部
//	    data.setAxisXTop(axisX); //x 轴在顶部
        axisX.setHasLines(true); //x 轴分割线


        Axis axisY = new Axis();  //Y轴
//        axisY.setName("y轴标注");//y轴标注
        axisY.setTextSize(11);//设置字体大小
        data.setAxisYLeft(axisY);  //Y轴设置在左边
        //data.setAxisYRight(axisY);  //Y轴设置在右边
        // 设置行为属性，支持缩放、滑动以及平移
        lineChart.setInteractive(true);//与用户互动
        lineChart.setZoomType(ZoomType.HORIZONTAL);  //缩放类型，水平
        lineChart.setMaxZoom((float) 3);//缩放比例
        lineChart.setLineChartData(data);
        lineChart.setVisibility(View.VISIBLE);
        /**注：下面的7，10只是代表一个数字去类比而已
         * 尼玛搞的老子好辛苦！！！见（http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2）;
         * 下面几句可以设置X轴数据的显示个数（x轴0-7个数据），当数据点个数小于（29）的时候，缩小到极致hellochart默认的是所有显示。当数据点个数大于（29）的时候，
         * 若不设置axisX.setMaxLabelChars(int count)这句话,则会自动适配X轴所能显示的尽量合适的数据个数。
         * 若设置axisX.setMaxLabelChars(int count)这句话,
         * 33个数据点测试，若 axisX.setMaxLabelChars(10);里面的10大于v.right= 7; 里面的7，则
         刚开始X轴显示7条数据，然后缩放的时候X轴的个数会保证大于7小于10
         若小于v.right= 7;中的7,反正我感觉是这两句都好像失效了的样子 - -!
         * 并且Y轴是根据数据的大小自动设置Y轴上限
         * 若这儿不设置 v.right= 7; 这句话，则图表刚开始就会尽可能的显示所有数据，交互性太差
         */
        Viewport v = new Viewport(lineChart.getMaximumViewport());
        v.left = 0;
        v.right= 7;
        lineChart.setCurrentViewport(v);
    }

    @OnClick({R.id.box1, R.id.box2, R.id.box3})
    public void onClick(View v) {
        clearState();
        switch (v.getId()){
            case R.id.box1:
                box1.setBackgroundColor(getResources().getColor(R.color.bgColor));
                initChartView(beanRes.getValue().getYdata().get(0).getData(), Color.parseColor("#ff9972dd"));
                break;
            case R.id.box2:
                box2.setBackgroundColor(getResources().getColor(R.color.bgColor));
                initChartView(beanRes.getValue().getYdata().get(1).getData(), Color.parseColor("#fff5873f"));
                break;
            case R.id.box3:
                box3.setBackgroundColor(getResources().getColor(R.color.bgColor));
                initChartView(beanRes.getValue().getYdata().get(2).getData(), Color.parseColor("#ff35a1d9"));
                break;
        }
    }

    private void boxState(){
        box1.setVisibility(View.GONE);
        box2.setVisibility(View.GONE);
        box3.setVisibility(View.GONE);
    }

    private void clearState(){
        box1.setBackgroundColor(getResources().getColor(R.color.white));
        box2.setBackgroundColor(getResources().getColor(R.color.white));
        box3.setBackgroundColor(getResources().getColor(R.color.white));
    }

    @Override
    public void onLazyLoad() {
        getDeviceInfo("加载中…");
    }
}
